package pck_tramitedocu.pck_src.pck_utiles;

import com.google.gson.Gson;
import java.io.UnsupportedEncodingException;
import java.util.*;
import java.util.logging.Level;
import java.util.logging.Logger;
import javax.servlet.http.HttpServletRequest;
import pck_tramitedocu.pck_src.pck_pojos.*;
import pck_tramitedocu.pck_src.pck_utiles.enums.TipoOperacionDocumentoEnum;
import pck_tramitedocu.pck_src.pck_utiles.enums.TipoUsuarioEnum;
import pck_tramitedocu.pck_src.pck_utiles.enums.TipoVistoBnoEnum;

public class cls_utilitarios {

    private static ArrayList<Cls_Documento_Tipo> ARRAY_DOCUMENTOS = new ArrayList<Cls_Documento_Tipo>();

    public static boolean isStringVacio(String dat) {
        return dat.trim().length() == 0;
    }

    public static boolean isNotStringVacio(String dat) {
        return !isStringVacio(dat);
    }

    public static void setArrayDocumentos(ArrayList<Cls_Documento_Tipo> array) {
        cls_utilitarios.ARRAY_DOCUMENTOS = array;
    }

    public static String obtenerDocumentoDesdeCodigo(String codigo) {
        for (Cls_Documento_Tipo documento_tipo : cls_utilitarios.ARRAY_DOCUMENTOS) {
            if (codigo.trim().compareToIgnoreCase(documento_tipo.getCodigo().trim()) == 0) {
                return documento_tipo.getDescripcion().trim() + " ";
            }
        }
        return null;
    }

    public static String obtenerCodigoEncriptadoParaExterno(String codigo) {
        String[] data = codigo.split("-");
        String num_docu = data[1];
        String retorno = "";
        for (int i = num_docu.length(); i < 6; i++) {
            retorno = retorno + "0";
        }
        retorno = retorno + num_docu;
        return retorno;
    }

    public static ArrayList<String> generarArrayDesdeString(String arrayList) {
        ArrayList retorno = new ArrayList();
        String[] array = arrayList.split(";");
        retorno.addAll(Arrays.asList(array));
        return retorno;
    }

    public static String generarStringDesdeArray(ArrayList<String> arrayList) {
        String retorno = "";
        for (String dat : arrayList) {
            retorno = retorno + dat + ";";
        }
        retorno = retorno.substring(0, retorno.length() - 1);
        return retorno;
    }

    public static String obtenerFechaActualFormateada() {
        Calendar ahoraCal = Calendar.getInstance();
        String retorno = "" + ahoraCal.get(5);
        switch (ahoraCal.get(2)) {
            case 0:
                retorno = retorno + " Enero";
                break;
            case 1:
                retorno = retorno + " Febrero";
                break;
            case 2:
                retorno = retorno + " Marzo";
                break;
            case 3:
                retorno = retorno + " Abril";
                break;
            case 4:
                retorno = retorno + " Mayo";
                break;
            case 5:
                retorno = retorno + " Junio";
                break;
            case 6:
                retorno = retorno + " Julio";
                break;
            case 7:
                retorno = retorno + " Agosto";
                break;
            case 8:
                retorno = retorno + " Septiembre";
                break;
            case 9:
                retorno = retorno + " Octubre";
                break;
            case 10:
                retorno = retorno + " Noviembre";
                break;
            case 11:
                retorno = retorno + " Diciembre";
        }
        retorno = retorno + " " + ahoraCal.get(1);
        return retorno;
    }

    public static ArrayList<Cls_Trabajador> convertirArrayTrabajadorFromArrayUnidades(ArrayList<Cls_Unidad_Organizativa> unidades_array) {
        ArrayList array_retorno = new ArrayList();
        for (Cls_Unidad_Organizativa unidades : unidades_array) {
            array_retorno.add(new Cls_Trabajador(unidades.getCodigo_area(), unidades.getJefe(), unidades.getJefe_cargo(), unidades.getNombre(), unidades.getJefe_profesion(), unidades.getCodigo_area(), unidades.getTipo_usuario(), unidades.getCorreo()));
        }
        return array_retorno;
    }

    public static String[] getArrayStringFromList(List<String> list) {
        int _tam = list.size();
        String[] arr = new String[_tam];
        int i = 0;
        for (String str : list) {
            arr[(i++)] = str;
        }
        return arr;
    }

    public static String obtenerTreeHtmlDesdeArray(ArrayList<Cls_TreeMenu> listTree) {
        StringBuffer li = new StringBuffer();
        List<Cls_TreeMenu> menuT = new ArrayList();
        for (Cls_TreeMenu tr : listTree) {
            if (tr.getId_padre() == 0) {
                menuT.add(tr);
            }
        }
        for (Cls_TreeMenu tr : menuT) {
            li.append("<li><label><input type='checkbox' id='");
            li.append(tr.getId()).append("'/>");
            li.append(tr.getNombre());
            li.append("</label><ul>");
            StringBuffer ul = new StringBuffer();
            for (Cls_TreeMenu _tr : listTree) {
                if (_tr.getId_padre() == tr.getId()) {
                    String chk = _tr.getOpcionActual() != 0 ? "checked='true'" : "";
                    ul.append("<li><label><input type='checkbox' ");
                    ul.append(chk);
                    ul.append(" class='submenus' id='");
                    ul.append(_tr.getId()).append("' />");
                    ul.append(_tr.getNombre());
                    ul.append("</label></li>");
                }
            }
            li.append(ul);
            li.append("</ul></li>");
        }
        return li.toString();
    }

    public static Map<String, Object> generarHashMapParaRequest(String[]... par) {
        Map map_retorno = new HashMap();
        for (String[] parametros : par) {
            map_retorno.put(parametros[0], parametros[1]);
        }
        return map_retorno;
    }

    public static Map<String, String> generarHashMapParaRequest(Map<String, String>[] maps) {
        Map map_retorno = new HashMap();
        for (Map map : maps) {
            map_retorno.putAll(map);
        }
        return map_retorno;
    }

    public static String generarContextoJsonDesdeObject(Object _object) {
        String json_data = new Gson().toJson(_object);
        if (json_data.contains("0-ERROR")) {
            json_data = json_data.replace("\"success\":true", "\"success\":false");
        }
        return json_data;
    }

    public static List<cls_nodo> converToArray(List<Cls_menu> menus) {
        List mimenu = new ArrayList();
        for (Cls_menu menu : menus) {
            if (menu.getPadre() == 0) {
                cls_nodo n = new cls_nodo(menu, null);
                mimenu.add(n);
            } else {
                int i = 0;
                boolean respuesta = false;
                int longitud = mimenu.size();
                while ((i < longitud) && (!respuesta)) {
                    respuesta = agregarMenu((cls_nodo) mimenu.get(i), menu);
                    if (!respuesta) {
                        i += 1;
                    }
                }
            }
        }
        return mimenu;
    }

    public static boolean agregarMenu(cls_nodo nodo, Cls_menu menu) {
        if (nodo.getData().getCodigo() == menu.getPadre()) {
            nodo.getHijos().add(new cls_nodo(menu, null));
            return true;
        }
        int i = 0;
        boolean respuesta = false;
        int longitud = nodo.getHijos().size();
        while (i < longitud) {
            cls_nodo n = (cls_nodo) nodo.getHijos().get(i);
            respuesta = agregarMenu(n, menu);
            if (respuesta) {
                return respuesta;
            }
            i += 1;
        }
        return false;
    }

    public static String converToString(List<cls_nodo> nodos) {
        StringBuilder cadena = new StringBuilder();
        for (cls_nodo nodo : nodos) {
            cadena.append(nodoToStringBuilder(nodo));
        }
        return cadena.toString();
    }

    public static StringBuilder nodoToStringBuilder(cls_nodo nodo) {
        StringBuilder respuesta = new StringBuilder("<li class='current'>");
        respuesta.append("<a href='").append(nodo.getData().getUrl()).append("'>").append(nodo.getData().getNombre()).append("</a>");
        if (nodo.getHijos().size() > 0) {
            respuesta.append("<ul>");
            for (cls_nodo n : nodo.getHijos()) {
                respuesta.append(nodoToStringBuilder(n));
            }
            respuesta.append("</ul>");
        }
        respuesta.append("</li>");
        return respuesta;
    }

    public static String cambiarOrdenFechaDeSql(String fecha) {
        String[] data_fecha = fecha.split("-");
        StringBuilder cadena = new StringBuilder();
        cadena.append(data_fecha[1]).append("/");
        cadena.append(data_fecha[2]).append("/");
        cadena.append(data_fecha[0]);
        return cadena.toString();
    }

    public static String cambiarOrdenFechaDeSqlParaGrilla(String fecha) {
        String[] data_fecha = fecha.split("-");
        StringBuilder cadena = new StringBuilder();
        cadena.append(data_fecha[2]).append("/");
        cadena.append(data_fecha[1]).append("/");
        cadena.append(data_fecha[0]);
        return cadena.toString();
    }

    public static String cambiarOrdenFechaDeSqlParaConsultaSql(String fecha) {
        String[] data_fecha = fecha.split("/");
        StringBuilder cadena = new StringBuilder();
        cadena.append(data_fecha[2]).append("-");
        cadena.append(data_fecha[1]).append("-");
        cadena.append(data_fecha[0]);
        return cadena.toString();
    }

    public static String obtenerValorDeDatoParaSplit(String dat, String caracter) {

        try {
            if (dat != null) {
                int ind = dat.indexOf(caracter);
                String retorno = dat.substring(ind + 1);
                return retorno;
            }
        } catch (NullPointerException ex) {
            Logger.getLogger(cls_utilitarios.class.getName()).log(Level.SEVERE, null, ex);
        }
        return "";
    }

    public static String utf8_decode(String cadena) {
        try {
            return new String(cadena.getBytes("ISO-8859-1"), "UTF-8");
        } catch (UnsupportedEncodingException ex) {
            Logger.getLogger(cls_utilitarios.class.getName()).log(Level.SEVERE, null, ex);
            return cadena;
        } catch (NullPointerException ex) {
            Logger.getLogger(cls_utilitarios.class.getName()).log(Level.SEVERE, null, ex);
        }
        return cadena;
    }

    public static String getAsuntoParaCopiaDeDerivacionHtml(ArrayList<String> array) {
        StringBuilder html = new StringBuilder("<table>");
        html.append("<tr><td>SE HAN ENVIADO UNA COPIA A LOS SIGUIENTES DESTINATARIOS:</td></tr>");
        for (String dato : array) {
            html.append("<tr><td>*)").append(dato).append("</td></tr>");
        }
        html.append("</table>");
        return html.toString();
    }

    public static String getPathArchivoLinux(String nombre_pdf) {
        try {
            String datos_documento[] = nombre_pdf.split("-");
            String url = Cls_Parametros.RUTA_DOCUMENTOS_SERVIDOR2 + datos_documento[2] + "/" + nombre_pdf + ".pdf";
            return url;
        } catch (NullPointerException ex) {
            Logger.getLogger(cls_utilitarios.class.getName()).log(Level.SEVERE, null, ex);
            return null;
        }
    }

    public static String getMensajeRegistroDocumento(Cls_documento documento, TipoOperacionDocumentoEnum tipoOperacion) {
        StringBuilder retorno = new StringBuilder();
        String TIPO_DOCUMENTO = cls_utilitarios.obtenerDocumentoDesdeCodigo(documento.getTipo_documento());
        String USUARIO_RECEPTOR_DOCUMENTO = "";
        String QUIEN_FIRMA = documento.getFirma();
        Cls_Trabajador usuario_crea_documento = Cls_Trabajador.obtenerTrabajadorDesdeInformacionDeUsuarioLogueado(documento.getUsuario_logueado());
        String DESTINATARIOS = documento.obtenerTodosDestinatariosParaMensaje();
        if (!documento.isIsProyectado()) {
            retorno.append(tipoOperacion.getMensaje()).append(" <b>").append(TIPO_DOCUMENTO);
            USUARIO_RECEPTOR_DOCUMENTO = DESTINATARIOS;
        } else {
            if (documento.getTipo_proyeccion().compareToIgnoreCase(Cls_Parametros.DOCUMENTO_PROYECCION_VERBAL) == 0) {
                retorno.append(tipoOperacion.getMensaje()).append(TIPO_DOCUMENTO).append(Cls_Parametros.STRING_PROYECTADO_VERBAL).append("</b>");
            } else if (documento.getTipo_proyeccion().compareToIgnoreCase(Cls_Parametros.DOCUMENTO_PROYECCION_ADJUNTA) == 0) {
                retorno.append(tipoOperacion.getMensaje()).append(TIPO_DOCUMENTO).append(Cls_Parametros.STRING_PROYECTADO_ADJUNTA).append("</b>");
            }
            if (TipoUsuarioEnum.PRACTICANTE.getCodigo().equals(usuario_crea_documento.getTipo_usuario_area())
                    || TipoUsuarioEnum.SUBORDINADO.getCodigo().equals(usuario_crea_documento.getTipo_usuario_area())) {
                USUARIO_RECEPTOR_DOCUMENTO = "SU JEFE INMEDIATO";
            } else {
                //Si solo tiene 1 es porque el documento no tiene vistos
                String codigoJefe = documento.getUsuario_logueado().replace(Cls_Parametros.CHARACTER_SEPARATOR_VERTICAL, Cls_Parametros.CHARACTER_SEPARATOR).
                        split(Cls_Parametros.CHARACTER_SEPARATOR)[0].trim();
                if (documento.getCodigo_directiva().size() > 1) {
                    for (Cls_Unidad_Organizativa unidad : documento.getCodigo_directiva()) {
                        String codigoArea = unidad.getNombre().replace(Cls_Parametros.CHARACTER_SEPARATOR_VERTICAL, Cls_Parametros.CHARACTER_SEPARATOR).
                                split(Cls_Parametros.CHARACTER_SEPARATOR)[0].trim();
                        if (cls_utilitarios.areNotStringEquals(codigoJefe, codigoArea)) {
                            String parametroParaWebService_01[] = {Cls_Parametros.Map_DNI, codigoArea};
                            Cls_Trabajador unidadDesdeWebService = Cls_InvocaWebService.validarLoginRRHHWs(generarHashMapParaRequest(parametroParaWebService_01)).get(0);
                            USUARIO_RECEPTOR_DOCUMENTO += "\t" + Cls_Parametros.CHARACTER_ASTERISCO + "\t" + unidadDesdeWebService.getNombres() + ".\n";
                        }
                    }
                    USUARIO_RECEPTOR_DOCUMENTO += Cls_Parametros.ENVIO_VISTOS;
                } else {
                    USUARIO_RECEPTOR_DOCUMENTO = "\t" + QUIEN_FIRMA.replace(Cls_Parametros.CHARACTER_SEPARATOR_VERTICAL, Cls_Parametros.CHARACTER_SEPARATOR).
                            split(Cls_Parametros.CHARACTER_SEPARATOR)[1];
                }
            }
        }
        retorno.append("\nFue Enviado A: \n").append(USUARIO_RECEPTOR_DOCUMENTO).append(" \nPara Su Respectiva Revision");
        if (cls_utilitarios.areStringEquals(documento.getTipo_documento(), Cls_Parametros.TIPO_DOCUMENTO_EXTERNO)) {
            retorno.append("\n\nCodigo Registro:</b><h2><b>").
                    append(codificarNumeroDocumento("" + Calendar.getInstance().get(Calendar.YEAR) + completarCeros(documento.getNumero_documento() + "", 6))).
                    append("</b></h2>");
        }
        return retorno.toString();
    }

    public static boolean areStringEquals(Object parametro_1, Object parametro_2) {
        String dat_1, dat_2;
        dat_1 = "" + parametro_1;
        dat_2 = "" + parametro_2;
        return dat_1.trim().compareToIgnoreCase(dat_2.trim()) == 0;
    }

    public static boolean areNotStringEquals(Object dat_1, Object dat_2) {
        return !areStringEquals(dat_1, dat_2);
    }

    public static boolean isLinux() {
        String name_SO = System.getProperty(Cls_Parametros.SISTEMA_OPERTATIVO);
        if (name_SO.toLowerCase().indexOf(Cls_Parametros.SO_WINDOWS) == 0) {
            return false;
        }
        return true;
    }

    public static String getMensajeParaDescripcionBandeja(Cls_documento documento) {
        String modalidad = null, tipoDocumento, tieneVisto;
        if (documento.isIsProyectado()) {
            if (cls_utilitarios.areStringEquals(documento.getTipo_proyeccion(), Cls_Parametros.DOCUMENTO_PROYECCION_VERBAL)) {
                modalidad = Cls_Parametros.STRING_PROYECTADO_VERBAL;
            } else if (cls_utilitarios.areStringEquals(documento.getTipo_proyeccion(), Cls_Parametros.DOCUMENTO_PROYECCION_ADJUNTA)) {
                modalidad = Cls_Parametros.STRING_PROYECTADO_ADJUNTA;
            }
        } else {
            modalidad = Cls_Parametros.STRING_NO_PROYECTADO;
        }
        tipoDocumento = cls_utilitarios.obtenerDocumentoDesdeCodigo(documento.getTipo_documento());
        tieneVisto = documento.getRespuesta_vistos().size() <= 1 ? Cls_Parametros.RESPUESTA_NO : Cls_Parametros.RESPUESTA_SI;

        StringBuilder detalleVisto = new StringBuilder();
        int contador = 1;
        for (Cls_Visto visto : documento.getRespuesta_vistos()) {
            if (cls_utilitarios.areNotStringEquals(documento.getCodigo_area_crea_documento(), visto.getCodigo_area())) {
                detalleVisto.append("<tr><td colspan='3'>");
                detalleVisto.append("<b>").append(contador).append(".- ").append(visto.getUnidad()).append(":</b>");
                if (cls_utilitarios.isStringVacio(visto.getObservacion())) {
                    detalleVisto.append("&nbsp&nbsp&nbsp&nbsp").append(TipoVistoBnoEnum.SIN_ACCION.getValor());
                } else {
                    detalleVisto.append("<br>&nbsp").append("<b>");
                    detalleVisto.append(visto.getObservacion());
                }
                detalleVisto.append("</td></tr>");
                contador++;
            }
        }
        StringBuffer mensajeParaBandeja = new StringBuffer("<table>").append("<tr>").
                append("<td class='parrafo'><b><p><u>Descripcion del Documento:</u></p></b></td>").
                append("</tr>").
                append("<tr>").
                append("<td class='textForm'>Modalidad</td>").
                append("<td>:</td>").
                append("<td>").
                append(modalidad).
                append("</td>").
                append("</tr>").
                append("<tr>").
                append("<td class='textForm'>Tipo de Documento</td>").
                append("<td>:</td>").
                append("<td>").
                append(tipoDocumento).
                append("</td>").
                append("</tr>").
                append("<tr>").
                append("<td class='textForm'>Tiene Vistos</td>").
                append("<td>:</td>").
                append("<td>").
                append(tieneVisto).
                append("</td>").
                append("</tr>");
        if (cls_utilitarios.isNotStringVacio(detalleVisto.toString())) {
            mensajeParaBandeja.append("<tr>").
                    append("<td class='textForm'>Detalle Vistos</td>").
                    append("<td>:</td>").
                    append("<td>").
                    append(detalleVisto.toString()).
                    append("</td>").
                    append("</tr>");
        } else {
            mensajeParaBandeja.append("<tr><td>&nbsp;</td></tr><tr><td>&nbsp;</td></tr><tr><td>&nbsp;</td></tr><tr><td>&nbsp;</td></tr><tr><td>&nbsp;</td></tr><tr><td>&nbsp;</td></tr><tr><td>&nbsp;</td></tr><tr><td>&nbsp;</td></tr><tr><td>&nbsp;</td></tr><tr><td>&nbsp;</td></tr><tr><td>&nbsp;</td></tr><tr><td>&nbsp;</td></tr><tr><td>&nbsp;</td></tr><tr><td>&nbsp;</td></tr><tr><td>&nbsp;</td></tr><tr><td>&nbsp;</td></tr><tr><td>&nbsp;</td></tr><tr><td>&nbsp;</td></tr><tr><td>&nbsp;</td></tr><tr><td>&nbsp;</td></tr><tr><td>&nbsp;</td></tr><tr><td>&nbsp;</td></tr>");
        }
        mensajeParaBandeja.append("</table>");
        return mensajeParaBandeja.toString();
    }

    public static Cls_documento obtenerObjetoDocumentoDesdeCodigo(String codigo) {
        Cls_documento documento = new Cls_documento();
        String codigoArray[] = codigo.split(Cls_Parametros.CHARACTER_SEPARATOR);
        documento.setTipo_documento(codigoArray[0]);
        documento.setNumero_documento(Long.parseLong(codigoArray[1]));
        documento.setAnhio(codigoArray[2]);
        return documento;
    }

    public static Cls_Trabajador obtenerTrabajadorDesdeDNI(String dni) {
        Map<String, Object> map = new HashMap<String, Object>();
        map.put(Cls_Parametros.Map_DNI, dni.trim());
        ArrayList<Cls_Trabajador> array_usuarios_encargaturas = Cls_InvocaWebService.validarLoginRRHHWs(map);
        return array_usuarios_encargaturas.get(0);
    }

    public static String codificarNumeroDocumento(String numero) {
        StringBuffer codigo = new StringBuffer("");
        for (int i = numero.length() - 1; i >= 0; i--) {
            codigo.append((char) (numero.charAt(i) + 27));
        }
        return codigo.toString();
    }

    public static String completarCeros(String cadena, int cantidad) {
        StringBuffer respuesta = new StringBuffer("");
        for (int i = 0; i < cantidad - cadena.length(); i++) {
            respuesta.append("0");
        }
        respuesta.append(cadena.trim());
        return respuesta.toString();
    }

    public static Map generarHashMapParaConsultaHistorial(HttpServletRequest request, String separador) {
        String[] codigo_array;
        String codigo_palito = request.getParameter(Cls_Parametros.Request_Codigo_DOCUMENTO);
        codigo_array = codigo_palito.split(separador);
        if (separador.equals(";")) {
            codigo_array = decodificarNumeroDocumento(codigo_array[1], codigo_array[0]);
        }
        /*
         * 327
         */ String[] parametrosParaFacade_01 = {Cls_Parametros.Map_TIPO_DOCUMENTO, codigo_array[0]};
        /*
         * 328
         */ String[] parametrosParaFacade_02 = {Cls_Parametros.Map_NUMERO_DOCUMENTO, codigo_array[1]};
        /*
         * 329
         */ String[] parametrosParaFacade_03 = {Cls_Parametros.Map_ANHIO_DOCUMENTO, codigo_array[2]};

        Map map = cls_utilitarios.generarHashMapParaRequest(new String[][]{parametrosParaFacade_01, parametrosParaFacade_02, parametrosParaFacade_03});
        if (request.getParameter("page") != null) {
            map.put("page", Integer.parseInt(request.getParameter("page")) * 3);
        }
        return map;
    }

    public static String[] decodificarNumeroDocumento(String codigo, String tipoDocumento) {
        String[] respuesta = {tipoDocumento, "-1", "-1"};

        if (codigo.length() == 10) {
            StringBuffer numero = new StringBuffer("");
            char c;
            for (int i = codigo.length() - 1; i >= 0; i--) {
                c = (char) (codigo.charAt(i) - 27);
                if (c <= 57 && c >= 48) {
                    numero.append(c);
                } else {
                    return respuesta;
                }
            }
            respuesta[2] = numero.substring(0, 4);
            respuesta[1] = numero.substring(4, 10);

        }
        return respuesta;
    }

    public static Map<String, Cls_Posibilidad> getPosibilidadesMap(
            ArrayList<Cls_Posibilidad> list) {
        Map<String, Cls_Posibilidad> map = new HashMap<String, Cls_Posibilidad>();
        for (Cls_Posibilidad item : list) {
            map.put(item.getTipoDocumento(), item);
        }
        return map;
    }
}
